<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    //经典--寄生继承
    function SuperFn() {
      this.a = [1, 2, 3, 4]
    }
    SuperFn.prototype.sayHi = function () {
      console.log('say hello~~')
    }

    function Fn() {
      // 目的在于属性
      SuperFn.call(this)
    }

    let newObj = Object.create(SuperFn.prototype)
    // newObj.__proto__=SuperFn.prototype  newObj是Super的实例化对象
    Fn.prototype = newObj
    // Fn.prototype.__proto__=SuperFn.prototype  就是通过Fn的原型对象的对象原型取访问SuperFn的原型上的方法

    // 方法存在bug就是，因为直接给Fn的prototype直接赋值，会覆盖掉之前上面的方法,因此方法要写在下面
    Fn.prototype.cry = function () {
      console.log('22222')
    }

    let fn1 = new Fn()
    let fn2 = new Fn()


    fn1.a.push(5)
    console.log(fn1.a)   //[1,2,3,4,5]
    console.log(fn2.a)    //[1,2,3,4]
    fn1.cry() //222

    //es6 推出class来解决继承的问题

    // class 子 extends 父 { }   子从父继承


  </script>

</body>

</html>